#!/bin/sh
cleanup(){
	echo "clean up call."
	# 删除临时目录及其中的输出文件
	rm -rf $output_dir
	rm -f dry1.o
	exit 0
}

#注册信号处理函数
trap 'cleanup' INT

#默认参数
exec_file="./dry"
N=3               #默认运行重复执行3次
nr_cores=$(nproc) #获取cpu核数为默认值
cpu_frequent=$(lscpu | grep "CPU max MHz:" | awk '{print $4}')  #获取CPU频率
if [ -z "$cpu_frequent" ]; then		
	cpu_frequent=2000		#没有获取到频率使用手动填写的频率
fi
parallel=false  #默认串行测试
# 解析命令行参数
while getopts "N:PC:E:" opt; do
	case $opt in
		N)
			N="$OPTARG"
			;;
		P)
			parallel=true
			;;
		C)
			nr_cores="$OPTARG"
			;;
		E)
			exec_file="$OPTARG"
			;;
		\?)
			echo "Invalid option: -$OPTARG" >&2
			echo "usage:sh dry.c [-E] [-C] [-P] [-N] : -E 可执行文件的路径 -C 指定需要测试的核数 -P 指定是否并行化测试 -N 指定测试重复次数" >&2
			exit 1
			;;
	esac
done
#输出基本信息
echo "system info: nr_cores=$nr_cores cpu_frequent=$cpu_frequent MHz"
echo "run info: exec_file=$exec_file N=$N run_cores=$nr_cores parallel=$parallel cpu_frequent=$cpu_frequent"
# 定义变量记录输出
max_dsvalue_ps=0
max_dmips_val=0
max_dmips_fre=0

# 创建临时目录来存储每个核心的输出文件
output_dir=$(mktemp -d -p ./)

# 并行运行程序，并将输出保存到不同的文件中
for i in $(seq 1 $N)
do
	for cidx in $(seq 0 $((nr_cores-1)))
	do 
		if [ "$parallel" = true ] 
		then taskset -c $cidx $exec_file 200000000 2>/dev/null >> $output_dir/output$cidx &
		else
			taskset -c $cidx $exec_file 200000000 2>/dev/null >> $output_dir/output$cidx
		fi
	done
	wait  #等待一轮运行完再执行下一轮
done

# 等待所有后台任务完成
wait

# 解析每个核心的输出结果并找出最优值
for i in $(seq 0 $((nr_cores-1)))
do
	max_dsvalue_ps=0
	while IFS= read -r line; do
		if echo "$line" | grep -q "Dhrystones per Second:"; then
			dsvalue_ps=$(echo "$line" | awk '{print $4}')
			#echo "core#$i value=$dsvalue_ps"
			if [ "$dsvalue_ps" -gt "$max_dsvalue_ps" ]; then
				max_dsvalue_ps=$dsvalue_ps
			fi
		fi
	done < "$output_dir/output$i" #从文件中获取输入
	
	max_dmips_val=$(awk "BEGIN {printf \"%.2f\", $max_dsvalue_ps / 1757.0}")  #将输出的值转换成DMIPS
	max_dmips_fre=$(awk "BEGIN {printf \"%.2f\", $max_dmips_val / $cpu_frequent}")  #计算DMIPS/MHz

	echo "core#$i $N次最优: DMIPS=$max_dmips_val DMIPS/MHz=$max_dmips_fre"
done

cleanup